package com.example.springsecurity02.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @ Description：自定义认证成功之后处理
 * <p>
 * 前后端分离项目， 跳转到前端自定义的登录页面
 * 只需要后端返回给前端一个json的数据
 * @ Tool：IntelliJ IDEA
 * @ Author：lk
 * @ Date：2024-10-16-11:34 PM
 * @ Version：1.0
 */
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

    /**
     * 当认证成功时调用的方法
     *
     * @param request        请求对象，用于获取请求相关信息
     * @param response       响应对象，用于向客户端发送响应数据
     * @param authentication 认证对象，包含认证相关信息
     * @throws IOException      如果发生输入输出异常
     * @throws ServletException 如果发生Servlet异常
     */
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        // 创建一个结果集来存放登录成功后的信息
        Map<String, Object> result = new HashMap<>();

        // 将登录成功的信息存入结果集
        result.put("msg", "登录成功");
        // 存入状态码200，表示请求成功
        result.put("status", 200);
        // 将认证对象存入结果集，以便于前端获取更多认证信息
        result.put("authentication", authentication);
        // 设置响应内容类型为JSON格式，字符集为UTF-8
        response.setContentType("application/json;charset-UTF-8");
        // 将结果集转换为JSON字符串
        String s = new ObjectMapper().writeValueAsString(result);
        // 向客户端发送响应，输出JSON字符串
        response.getWriter().println(s);
    }
}